package com.pp.scene;

import static javax.media.opengl.GL.GL_BLEND;
import static javax.media.opengl.GL.GL_COLOR_BUFFER_BIT;
import static javax.media.opengl.GL.GL_DEPTH_BUFFER_BIT;
import static javax.media.opengl.GL.GL_NICEST;
import static javax.media.opengl.GL.GL_ONE;
import static javax.media.opengl.GL.GL_SRC_ALPHA;
import static javax.media.opengl.GL2ES1.GL_PERSPECTIVE_CORRECTION_HINT;
import static javax.media.opengl.GL2ES1.GL_POINT_SMOOTH_HINT;
import static javax.media.opengl.fixedfunc.GLLightingFunc.GL_SMOOTH;
import static javax.media.opengl.fixedfunc.GLMatrixFunc.GL_MODELVIEW;
import static javax.media.opengl.fixedfunc.GLMatrixFunc.GL_PROJECTION;

import javax.media.opengl.GL2;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.glu.GLU;

import com.pp.particles.FireSystem;

public class GraphicListener implements GLEventListener {

    private GL2 gl;
    private GLU glu = new GLU();

    private FireSystem ps;

    @Override
    public void init(GLAutoDrawable drawable) {
	gl = drawable.getGL().getGL2();
	ps = new FireSystem(gl);

	gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
	gl.glClearDepth(1.0f);

	gl.glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);

	gl.glShadeModel(GL_SMOOTH);

	gl.glEnable(GL_BLEND);
	gl.glBlendFunc(GL_SRC_ALPHA, GL_ONE);
	gl.glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);
    }

    @Override
    public void dispose(GLAutoDrawable drawable) {
	// TODO Auto-generated method stub
    }

    @Override
    public void display(GLAutoDrawable drawable) {

	gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

	gl.glLoadIdentity();

	ps.display();
    }

    @Override
    public void reshape(GLAutoDrawable drawable, int x, int y, int width,
	    int height) {

	if (height == 0) {
	    height = 1;
	}

	gl.glViewport(0, 0, width, height);

	gl.glMatrixMode(GL_PROJECTION);
	gl.glLoadIdentity();

	float aspect = (float) width / height;
	glu.gluPerspective(45.0, aspect, 0.1, 100.0);

	gl.glMatrixMode(GL_MODELVIEW);
	gl.glLoadIdentity();
    }
}